package com.hushui.common.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

import org.springframework.beans.BeanUtils;

/**
 * 集合数据拷贝工具类封装
 *
 * @author QC
 * @version V1.0
 * @since 2022-08-14
 */
public class BeanUtilCopy extends BeanUtils {

    /**
     * 集合数据的拷贝
     *
     * @param sources: 数据源类
     * @param target:  目标类::new(eg: UserVO::new)
     * @return list 目标数据对象列表
     */
    public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target) {
        return copyListProperties(sources, target, null);
    }

    /**
     * 带回调函数的集合数据的拷贝（可自定义字段拷贝规则）
     *
     * @param sources:      数据源类
     * @param target:       目标类::new(eg: UserVO::new)
     * @param copyCallBack: 回调函数 用于扩展修改字段数据类型，比如int改为string
     * @return list 目标数据对象列表
     */
    public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target, BeanUtilCopyCallBack<S, T> copyCallBack) {
        List<T> list = new ArrayList<>(sources.size());
        for (S source : sources) {
            T targetData = target.get();
            copyProperties(source, targetData);
            list.add(targetData);
            if (copyCallBack != null) {
                copyCallBack.callBack(source, targetData); // 回调
            }
        }
        return list;
    }
}
